# 多阶段构建
# 第一阶段：构建应用
FROM 172.20.7.86:5001/nodejs/node22-alpine:latest AS builder

# 设置工作目录
WORKDIR /app

# 修复权限问题
USER root
RUN chown -R node:node /app

# 复制package文件
COPY package*.json ./
RUN chown -R node:node /app

# 切换到node用户
USER node

# 使用国内源安装依赖
RUN npm install --registry=https://registry.npmmirror.com/
RUN npm ci --include=dev --registry=https://registry.npmmirror.com/

# 复制源代码
COPY --chown=node:node . .

# 在构建前生成 config.local.json
RUN cp src/config/config.template.json src/config/config.local.json && \
    sed -i 's|"http://localhost:8091"|"http://10.48.0.86:8090"|g' src/config/config.local.json

# 构建应用
RUN npm run build

# 第二阶段：nginx运行时
FROM 172.20.7.86:5001/webserver/nginx-alpine:latest

# 使用国内Alpine镜像源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
    apk add --no-cache git bash

# 创建应用目录和SSL证书目录
RUN mkdir -p /app/src/config /etc/nginx/ssl

# 复制构建产物到nginx目录（uni-app H5构建输出在dist/build/h5目录）
COPY --from=builder /app/dist/build/h5 /usr/share/nginx/html

# 复制配置模板文件
COPY src/config/config.template.json /app/src/config/config.template.json

# 创建nginx配置文件（支持HTTPS，使用非标准端口）
RUN cat > /etc/nginx/conf.d/default.conf <<EOF
# HTTP服务器 - 重定向到HTTPS（使用8081端口避免备案）
server {
    listen 8081;
    server_name _;
    
    # 重定向所有HTTP请求到HTTPS（8444端口）
    return 301 https://\$host:8444\$request_uri;
}

# HTTPS服务器（使用8444端口避免备案）
server {
    listen 8444 ssl http2;
    server_name _;
    root /usr/share/nginx/html;
    index index.html;
    
    # SSL证书配置
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    
    # SSL安全配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
    # 安全头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    
    # 处理Vue Router的history模式
    location / {
        try_files \$uri \$uri/ /index.html;
    }
    
    # 静态资源缓存
    location ~* \\.(js|css|png|jpg|jpeg|gif|ico|svg)\$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
    
    # API代理（主API）
    location /api/ {
        proxy_pass http://10.48.0.86:8090/;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto \$scheme;
    }
    
    # LLM API代理
    location /llm-api/llm/chat {
        proxy_pass https://ws.waterism.tech:8091/api/execute;
        proxy_set_header Host ws.waterism.tech;
        proxy_set_header X-Real-IP \$remote_addr;
        proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto \$scheme;
        proxy_ssl_verify off;
        proxy_ssl_server_name on;
    }
}
EOF

# 创建启动脚本
RUN cat > /docker-entrypoint.sh <<EOF
#!/bin/bash
set -e

# 生成config.local.json文件
echo "Generating config.local.json from template..."
cp /app/src/config/config.template.json /usr/share/nginx/html/config.local.json

# 如果有环境变量，可以在这里替换配置
if [ ! -z "\$API_BASE_URL" ]; then
    echo "Updating API base URL to: \$API_BASE_URL"
    sed -i "s|http://10.48.0.86:8090|\$API_BASE_URL|g" /usr/share/nginx/html/config.local.json
fi

# 检查SSL证书是否存在
if [ ! -f "/etc/nginx/ssl/server.crt" ] || [ ! -f "/etc/nginx/ssl/server.key" ]; then
    echo "WARNING: SSL certificates not found at /etc/nginx/ssl/"
    echo "Please mount your SSL certificates when running the container:"
    echo "  docker run -v /path/to/certs:/etc/nginx/ssl:ro ..."
    echo ""
    echo "Generating self-signed certificate for testing..."
    apk add --no-cache openssl
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \\
        -keyout /etc/nginx/ssl/server.key \\
        -out /etc/nginx/ssl/server.crt \\
        -subj "/C=CN/ST=Beijing/L=Beijing/O=Organization/CN=localhost"
    echo "Self-signed certificate generated. For production, please use a proper SSL certificate."
fi

echo "Starting nginx with HTTPS support..."
exec nginx -g 'daemon off;'
EOF

# 给启动脚本执行权限
RUN chmod +x /docker-entrypoint.sh

# 暴露端口（HTTP和HTTPS，使用非标准端口避免备案）
EXPOSE 8081 8444

# 设置启动命令
CMD ["/docker-entrypoint.sh"]

# ===========================
# 容器启动方式说明
# ===========================
#
# 说明：使用8081和8444端口，避免中国大陆80/443端口备案要求
# 访问地址：http://your-domain:8081 或 https://your-domain:8444
#
# 方式一：使用自签名证书启动（开发/测试环境）
# docker run -d -p 8081:8081 -p 8444:8444 --name zhixun-app <镜像名>
# 说明：容器会自动生成自签名证书，浏览器会提示不安全，需要手动信任
#
# 方式二：挂载自有SSL证书启动（生产环境 - 推荐）
# docker run -d \\
#   -p 8081:8081 \\
#   -p 8444:8444 \\
#   -v /opt/ssl/zhixun-app:/etc/nginx/ssl:ro \\
#   -e API_BASE_URL=http://10.48.0.86:8090 \\
#   --name zhixun-app \\
#   <镜像名>
# 说明：需要将服务器上的SSL证书目录挂载到容器的 /etc/nginx/ssl 目录
# 要求：目录中必须包含 server.crt（证书文件）和 server.key（私钥文件）
#
# 方式三：使用Docker Compose启动（最推荐）
# 参考项目根目录下的 docker-compose.yml 文件
# docker-compose up -d
#
# 证书文件说明：
# - server.crt: SSL证书文件（包含公钥和证书信息）
# - server.key: SSL私钥文件（需要妥善保管，不要泄露）
# 
# 端口说明：
# - 8081端口：HTTP访问（会自动跳转到8444）
# - 8444端口：HTTPS访问（主要访问端口）
# 
# 防火墙配置：
# sudo firewall-cmd --permanent --add-port=8081/tcp
# sudo firewall-cmd --permanent --add-port=8444/tcp
# sudo firewall-cmd --reload
# 
# 访问示例：
# https://ws.waterism.tech:8444
# 
# 如何获取SSL证书，请参考 docs/服务器端/SSL证书配置指南.md